package com.handydata.antifraud.ws.dap;

import com.alibaba.fastjson.JSONObject;
import com.handydata.antifraud.annotation.Comment;
import com.handydata.antifraud.common.constant.DataSourceCode;
import com.handydata.antifraud.common.exception.WsInvokeException;
import com.handydata.antifraud.to.dap.ALiYunReqTO;
import com.handydata.antifraud.to.dap.ALiYunResTO;
import com.handydata.antifraud.util.DateUtil;
import com.handydata.antifraud.util.encrypt.Md5Utils;
import com.handydata.antifraud.ws.WsInvocationService;

import lombok.extern.slf4j.Slf4j;

import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;

import java.util.Date;

/**
 * 阿里云申请反欺诈分
 *
 */
@Slf4j
@Service("aLiYunWsService")
@Comment("阿里云申请反欺诈分")
public class ALiYunWsServiceImpl extends
		DataPlatformWsService<ALiYunReqTO, ALiYunResTO> implements
		WsInvocationService<ALiYunReqTO, ALiYunResTO> {

	@Override
	public ALiYunResTO query(ALiYunReqTO req) throws WsInvokeException {
		log.info("阿里云申请反欺诈分请求参数 {}", req);
		this.dataType = DataSourceCode.A_LI_YUN.getCode();
		return executeQuery(req);
	}

	@Override
	protected String createQueryXml(ALiYunReqTO req) {
		StringBuilder xml = new StringBuilder();
		xml.append("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>");
		xml.append("<subatm>");
		xml.append("<application>GwBiz.Req</application>");
		xml.append("<version>2.0.0</version>");
		xml.append("<sendTime>").append(DateUtil.now14()).append("</sendTime>");
		xml.append("<transCode>300672</transCode>");
		xml.append("<channelId>").append(encryInfo.getChannelId()).append("</channelId>");
		xml.append("<channelOrderId>").append(DateUtil.now17()).append("</channelOrderId>");
		xml.append("<cid>").append(req.getIdCard()).append("</cid>");
		xml.append("<name>").append(req.getName()).append("</name>");
		xml.append("<phone>").append(Md5Utils.md5ToHexStr(req.getPhoneNum())).append("</phone>");
//		xml.append("<phone>").append(req.getPhoneNum()).append("</phone>");
		xml.append("<accountId>").append("</accountId>");
		xml.append("<email>").append("</email>");
		xml.append("<ip>").append("</ip>");
		xml.append("<deviceToken>").append("</deviceToken>");
		xml.append("<refer>").append("</refer>");
		xml.append("<mac>").append("</mac>");
		xml.append("<userTags>").append("</userTags>");
		xml.append("</subatm>");
		log.info("阿里云申请反欺诈分调用翰迪数据平台请求报文{}", xml);
		req.setQueryXml(xml.toString());
		return xml.toString();
	}

	@Override
	protected ALiYunResTO parseResultAndSave(String resultXml,
			String orderId, Date createDate) {
		log.info("调用阿里云申请反欺诈分接口返回报文：{}", resultXml);
		ALiYunResTO resTO = new ALiYunResTO();
		try {
			// 解析xml，保存本地DB
			JSONObject jasonObject = JSONObject.parseObject(resultXml);
			if (null != jasonObject) {
				if ("0000".equals(jasonObject.get("resCode"))) {
					JSONObject data = JSONObject.parseObject(jasonObject.getString("resData"));
					double riskScore = Double.parseDouble(data.getString("score"));
					resTO.setAntiFraudScore(riskScore);
				}
				resTO.setResCode((String) jasonObject.get("resCode"));
				resTO.setResMsg((String) jasonObject.get("resMsg"));
			} else {
				resTO.setResCode("0001");
				resTO.setResMsg("阿里云申请反欺诈分接口返回失败");
			}
		} catch (Exception e) {
			log.info("调用阿里云申请反欺诈分接口返回报文解析异常：{}", e);
			resTO.setResCode("1111");
			resTO.setResMsg("调用阿里云申请反欺诈分接口异常");
		}
		log.info("调用阿里云申请反欺诈分接口返回结果：{}", JSONObject.toJSONString(resTO));
		return resTO;
	}

	@SuppressWarnings("unchecked")
	@PostConstruct
	@Override
	public void register() {
		registerToWsServiceFactory(this, ALiYunReqTO.class);
	}

}
